const {ccclass, property} = cc._decorator;

@ccclass
export default class RemoteSensingHandle extends cc.Component {

    // LIFE-CYCLE CALLBACKS:

    // onLoad () {}

    // 摇杆中心点
    @property(cc.Node)
    stick: cc.Node;

    // 摇杆最大半径
    @property(cc.Integer)
    maxRadius:number = 0;

    // 摇杆方向
    public direct: cc.Vec2 = cc.v2(0, 0);

    protected onLoad(): void {
        this.controlDown();
    }

    start () {
        // console.log(this.stick);
        
    }

    // 监听触摸消息
    controlDown() {
        // TOUCH_START:当手指触摸到屏幕时
        // TOUCH_MOVE: 当手指在屏幕上移动时
        // TOUCH_END: 当手指在目标节点区域内离开屏幕时
        // TOUCH_CANCEL: 当手指在目标节点区域外离开屏幕时

        
        this.stick.on(cc.Node.EventType.TOUCH_MOVE, this.stickMove, this);

        this.stick.on(cc.Node.EventType.TOUCH_END, this.stickEnd, this);
        this.stick.on(cc.Node.EventType.TOUCH_CANCEL, this.stickEnd, this);
    }

    // 摇杆中心触摸移动
    stickMove(e: cc.Touch) {
        // getLocation: 获取当前触点位置
        // convertToNodeSpaceAR: 将一个点转换到节点 (局部) 空间坐标系
        // console.log(e.getLocation());
        
        let location = e.getLocation();
        let pos = this.node.convertToNodeSpaceAR(location);
        // mag: 返回该向量的长度
        let len = pos.mag();
        if(this.maxRange(pos, len)) {
            this.stick.setPosition(pos);
        } else {
            // 超出最大范围,移动改变中心方向
            this.stick.setPosition(pos.x * this.maxRadius / len, pos.y * this.maxRadius / len);
        }
        this.direct = cc.v2(pos.x / len, pos.y / len);  // (cos, sin)
        
    }
    // 触摸结束
    stickEnd() {
        this.direct = cc.v2(0, 0);
        this.stick.setPosition(0, 2);
    }
    // 判断是否超出摇杆最大范围
    maxRange(pos: cc.Vec2, len?: number):boolean {
        // 用坐标计算
        // if (Math.pow(pos.x, 2) + Math.pow(pos.y, 2) > Math.pow(this.maxRadius, 2)) {
        //     return false;
        // } else {
        //     return true;
        // }

        // 或者使用mag: 返回该向量的长度
        if (len > this.maxRadius) {
            return false;
        } else {
            return true;
        }
    }

    // update (dt) {}
}
